package javax;

/**
 * Created by xupeng20 on 2019/1/11.
 */
public class Xp_0114 {
    //单例设计模式懒汉、恶汉、双重锁 内部类

    /**
     * 懒汉
     */
    private Xp_0114(){}
    private static final  Xp_0114 xp=new Xp_0114();
    public static Xp_0114 getXp(){
        return xp;
    }


    /**
     * 饿汉
     */
    private static Xp_0114 xp1 = null;
//    private Xp_0114(){};
    public static synchronized Xp_0114 getXp1(){
        if (null == xp1){
            xp1 = new Xp_0114();
        }
        return xp1;
    }

    /**
     * 双重检查锁
     */
    private static Xp_0114 xp2 = null;
    //    private Xp_0114(){};
    public static Xp_0114 getXp2(){
        if (null == xp2){
            //类名.class 获取一个类对象  这里存在一个不安全的地方、如果一个线程实例、另一个线程正在做第一次检查那么第一次就会检查到有实例、
            // 就会正在实例但是还没有实例完成的一个对象（虽然里面已经是原子性了 但是可能还没有完）
            //要想很好的解决这个问题、那么就只有想办法解决在什么时候、new这个对象 一种是内部类
            synchronized (Xp_0114.class){
                if (null == xp2){
                    xp2 = new Xp_0114();
                }
            }
        }
        return xp2;
    }
    /**
     * 内部类 静态方法私有化 当Xp_0114被加载  内部类不会被初始化 所以在载入jvm时  单例的类就没有被初始化  只有调用get方法才会实例
     */
    private static Xp_0114 xp3 = null;
    public static class Test{
        private static Xp_0114 xp3 = new Xp_0114();
    }
    public static synchronized Xp_0114 getXp3(){
        return Test.xp3;
    }
    /**
     *
     */

}
